package com.ljx.factoryMode;

/**
 * 抽象工厂
 * 优点：
 * 可以确信你从工厂得到的产品彼此是兼容的
 * 可以避免具体产品和客户端代码之间的紧密耦合
 * 符合单一职责原则
 * 符合开闭原则
 *
 * 应用场景：
 * 程序需要处理不同系列的相关产品，但是您不希望它依赖于这些产品的具体类时
 * 可以使用抽象工厂
 *
 * 经典案例：
 * Calendar 类获取日历类对象
 * JDBC 获取数据库连接
 * Logback 中的 LoggerFactory 获取 Logger 对象
 *
 * @作者 LJX
 * @日期 2022/12/20 10:29
 */
public class AbstractFactoryTest {

    public static void main(String[] args) {
        IDatabaseUtils idu = new MysqlIDatabaseUtils();
        idu.getcommand().command();
        idu.getconnect().connect();

        IDatabaseUtils idus = new OracleIDatabaseUtils();
        idus.getcommand().command();
        idus.getconnect().connect();
    }

}

/**
 * 数据库链接接口
 */
interface IConnection{
    void connect();
}
/**
 * 数据库命令接口
 */
interface ICommand{
    void command();
}
/**
 * 数据库工具接口
 */
interface IDatabaseUtils{
    IConnection getconnect();
    ICommand getcommand();
}


/**
 * MySQL数据库
 */
class MysqlIConnection implements IConnection{
    @Override
    public void connect() {
        System.out.println("MySQL连接......");
    }
}
class MysqlICommand implements ICommand{
    @Override
    public void command() {
        System.out.println("MySQL命令处理......");
    }
}
class MysqlIDatabaseUtils implements IDatabaseUtils{

    @Override
    public IConnection getconnect() {
        return new MysqlIConnection();
    }

    @Override
    public ICommand getcommand() {
        return new MysqlICommand();
    }
}

/**
 * Oracle数据库
 */
class OracleIConnection implements IConnection{
    @Override
    public void connect() {
        System.out.println("Oracle连接......");
    }
}
class OracleICommand implements ICommand{
    @Override
    public void command() {
        System.out.println("Oracle命令处理......");
    }
}
class OracleIDatabaseUtils implements IDatabaseUtils{

    @Override
    public IConnection getconnect() {
        return new OracleIConnection();
    }

    @Override
    public ICommand getcommand() {
        return new OracleICommand();
    }
}
